package org.huangrui.spark.java.sql;

import org.apache.spark.sql.SparkSession;

import static org.apache.spark.sql.types.DataTypes.StringType;

/**
 * @Author hr
 * @Create 2024-10-20 17:03
 */
class SparkSQL03_SQL_UDF {
    public static void main(String[] args) {
        SparkSession spark = SparkSession.builder().appName("SparkSQL03_UDF").master("local[*]").getOrCreate();
        spark.read().json("data/user.json").createOrReplaceTempView("user");

        // prefix + name
        //  Name: + zhangsan
        //  Name: + lisi
        //  Name: + wangwu
        //String sql = "select 'Name:' + name from user";
        //String sql = "select concat('Name:',name) from user";
        //String sql = "select 'Name:'||name from user";
        // mysql, oracle(||), db2, sqlserver
        // Shark => Spark On Hive => SparkSQL => Spark parse SQL
        //       => Hive On Spark => 数据仓库   => Hive parse SQL


        // TODO SparkSQL提供了一种特殊的方式，可以在SQL中增加自定义方法来实现复杂的逻辑

        // TODO 如果想要自定义的方法能够在SQL中使用，那么必须在Spark中进行声明和注册
        //      register方法需要传递3个参数
        //           第一个参数表示SQL中使用的方法名
        //           第二个参数表示逻辑 : IN => OUT
        //           第三个参数表示返回的数据类型 : DataType类型数据，需要使用scala语法操作，需要特殊的使用方式。
        //                 scala Object => Java
        //                 StringType$.MODULE$ => case object StringType
        //                 DataTypes.StringType
        spark.udf().register("prefixName", (String name) -> "Name:" + name, StringType);

        spark.sql("select prefixName(name) from user").show();


        spark.stop();
    }
}
